/*
	*@brief				:pthread_attr_init()函 数 对 该对象进 行初始 化操作 ，当对象 不再使 用时 ， 需要使用pthread_attr_destroy()函数将其销毁
						获取设置栈的起始地址以及栈大小。

	*@param[attr]		:调用 pthread_create()创建线程时，参数 attr 设置为 NULL， 表示使用属性的默认值创建线程。 如果不使用默认值，参数 attr 必须要指向一个 pthread_attr_t 对象;
	*@param[stackaddr]	:栈起始地址。
	*@param[stacksize]	:栈大小

	*return				:成功返回 0，失败将返回一个非 0 值的错误码.
 */
//int pthread_attr_init(pthread_attr_t *attr);
//int pthread_attr_destroy(pthread_attr_t *attr);
//int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);

/*修改地址二级指针，修改值一级指针。*/
//int pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize); 
//int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
//int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);
//int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);
//int pthread_attr_getstackaddr(const pthread_attr_t *attr, void **stackaddr);


/*创建新的线程，将线程的栈大小设置为 4Kbyte。*/

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

static void *new_thread_start(void *arg)
{
	puts("新线程--start run");
	pthread_exit((void *)10);
}


int main(void)
{
	pthread_t tid;
	pthread_attr_t attr;

	void *stackaddr;
	size_t stacksize;//这里不能定义为指针变量 定义为指针变量，执行会报错Segmentation fault (core dumped)

	void *tret;
	int ret;

	//线程属性函数初始化
	pthread_attr_init(&attr);

	/* 设置栈大小为 4K */
	pthread_attr_setstacksize(&attr, 4096);

	//申请一个线程
	ret = pthread_create(&tid, &attr, new_thread_start, NULL);
	if (ret)
	{
		fprintf(stderr,"pthread_create error:%s\n",strerror(ret));
		exit(-1);
	}

	//	pthread_attr_getstack(&attr,&stackaddr,&stacksize);   //栈起始地址：(nil) 栈大小：0

	//	pthread_attr_getstackaddr(&attr, &stackaddr);
	//	pthread_attr_getstacksize(&attr, &stacksize);		//栈起始地址：(nil) 栈大小：8388608

	//  printf("栈起始地址：%p 栈大小：%ld\n",stackaddr,stacksize);

	//回收一个线程
	ret = pthread_join(tid, &tret);
	if (ret)
	{
		fprintf(stderr, "pthread_join error:%s\n", strerror(ret));
		exit(-1);
	}

	printf("新线程终止, code=%ld\n", (long)tret);

	/* 销毁 attr 对象 */
	pthread_attr_destroy(&attr);

	exit(0);
}